#ifndef __SOFT_TIMER_H
#define __SOFT_TIMER_H

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef void (*sft_tmr_callback_t)(void *);

struct sft_tmr_t;

//内存管理钩子
struct memory_management_hooks_t {
      void *(*malloc_fn)(uint32_t sz);
      void (*free_fn)(void *ptr);
};

/**
* @brief    初始化内存管理钩子函数
* @param    hooks： 用户传递的钩子函数结构
* @retval   void
*/
void sft_tmr_init_hooks(struct memory_management_hooks_t *hooks);
/**
* @brief    创建一个定时器
* @param    sft_tmr： 作为定时器句柄返回
* @param    period： 定时器超时值
* @param    auto_reload： 是否自动重装载（非零则定时器到期后自动进行重装载）
* @param    tmr_callBack： 定时器到期执行的回调函数
* @param    para： 回调函数入参
* @retval   <0：失败，>=0成功
*/
int32_t sft_tmr_create(struct sft_tmr_t **sft_tmr, uint32_t period, uint32_t auto_reload, sft_tmr_callback_t tmr_callBack, void *para);
/**
* @brief    删除一个定时器
* @param    sft_tmr： 对应定时器句柄
* @retval   void
*/
void sft_tmr_delete(struct sft_tmr_t *sft_tmr);
/**
* @brief    修改定时器的超时值（更改后需要重启定时器）
* @param    sft_tmr： 对应定时器句柄
* @param    period： 定时器超时值
* @retval   void
*/
void sft_tmr_change_period(struct sft_tmr_t *sft_tmr, uint32_t period);
/**
* @brief    获取定时器的超时值
* @param    sft_tmr： 对应定时器句柄
* @retval   0：失败，>0：欲获取的定时器的超时值
*/
uint32_t sft_tmr_get_period(struct sft_tmr_t *sft_tmr);
/**
* @brief    重定向定时器的回调函数
* @param    sft_tmr： 对应定时器句柄
* @param    tmr_callBack： 定时器到期执行的回调函数
* @param    para： 回调函数入参
* @retval   void
*/
void sft_tmr_redirect_callback(struct sft_tmr_t *sft_tmr, sft_tmr_callback_t tmr_callBack, void *para);
/**
* @brief    启动定时器（如果定时器已经启动，则更新到期时间）
* @param    sft_tmr： 对应定时器句柄
* @param    triger_now： 是否立即触发（非零则立即触发）
* @retval   void
*/
void sft_tmr_start(struct sft_tmr_t *sft_tmr, uint32_t triger_now);
/**
* @brief    暂停定时器
* @param    sft_tmr： 对应定时器句柄
* @retval   void
*/
void sft_tmr_pause(struct sft_tmr_t *sft_tmr);
/**
* @brief    定时器tick自增，强烈建议以1ms为单位
* @retval   void
*/
void sft_tmr_inc_tick(void);
/**
* @brief    定时器主循环，当相应定时器到期后执行用户回调
* @retval   void
*/
void sft_tmr_loop(void);

/**
* @brief    定时器遍历
* @note     仅用于调试
* @retval   void
*/
void tmr_list_for_each(void);

#endif/*__SOFT_TIMER_H*/
